
#include <stdint.h>
#include "KeyBoardMap.h"


typedef struct {
	uint8_t value;
	uint8_t shift;
	uint8_t code;
}CodeMapItem;

static const CodeMapItem KeyboardCodeMap[] = {
	{'a', 'A', KEY_A},
	{'b', 'B', KEY_B},
	{'c', 'C', KEY_C},
	{'d', 'D', KEY_D},
	{'e', 'E', KEY_E},
	{'f', 'F', KEY_F},
	{'g', 'G', KEY_G},
	{'h', 'H', KEY_H},
	{'i', 'I', KEY_I},
	{'j', 'J', KEY_J},
	{'k', 'K', KEY_K},
	{'l', 'L', KEY_L},
	{'m', 'M', KEY_M},
	{'n', 'N', KEY_N},
	{'o', 'O', KEY_O},
	{'p', 'P', KEY_P},
	{'q', 'Q', KEY_Q},
	{'r', 'R', KEY_R},
	{'s', 'S', KEY_S},
	{'t', 'T', KEY_T},
	{'u', 'u', KEY_U},
	{'v', 'V', KEY_V},
	{'w', 'W', KEY_W},
	{'x', 'X', KEY_X},
	{'y', 'Y', KEY_Y},
	{'z', 'Z', KEY_Z},
	
	{'1', '!', KEY_1},
	{'2', '@', KEY_2},
	{'3', '#', KEY_3},
	{'4', '$', KEY_4},
	{'5', '%', KEY_5},
	{'6', '^', KEY_6},
	{'7', '&', KEY_7},
	{'8', '*', KEY_8},
	{'9', '(', KEY_9},
	{'0', ')', KEY_0},
	{' ', ' ', KEY_SPACE},
	{'-', '_', KEY_SUB},
	{'=', '+', KEY_EQUAL},
	{'[', '{', KEY_LEFT_BRACKET},
	{']', '}', KEY_RIGHT_BRACKET},
	{'\\', '|', KEY_VERTICAL_LINE},
	{'`', '~', KEY_WAVE},
	{';', ':', KEY_SEMICOLON}, // ; and :
	{'\'', '\"', KEY_QUOTE} , // ' and "
	{',', '<', KEY_COMMA} , // , and <
	{'.', '>', KEY_DOT }, // . and >
	{'/', '?', KEY_QUESTION}, // / and ?
};

int KeyMap_ValueToCode(uint8_t ch, int* shift){
	if(ch){
		const CodeMapItem* item;
		int i;
		for(i = 0; i < sizeof(KeyboardCodeMap) / sizeof(KeyboardCodeMap[0]); i++){
			item = &KeyboardCodeMap[i];
			if(item->value == ch){
				*shift = 0;
				return item->code;
			}
			if(item->shift == ch){
				*shift = 1;
				return item->code;
			}
		}
	}
	return -1;
}



